package com.jmb.demo.simple;

public class PairPrinciple {
    /**
     * 解释一下我们在Pair下用的泛型基本原理。
     * 泛型类型参数到底是什么呢？为什么一定要定义类型参数呢？定义普通类，直接使用Object不就行了吗？
     * 比如我们直接把例子的类后边<T,S>去掉,然后把下边的变量和方法的T,S变成，object类不就好了吗。
     * 如下边例子：
     * 总结：泛型的好处其实就是，带来好的安全性，好的可读性。
     */
    Object first;
    Object second;

    public PairPrinciple(Object first, Object second) {
        this.first = first;
        this.second = second;
    }

    public Object getFirst() {
        return first;
    }

    public Object getSecond() {
        return second;
    }
    // 然后我们调用输出
    public static void main(String[] args) {
        // 实例化
        PairPrinciple pairPrinciple = new PairPrinciple(1,100);
        // 如果我们想输出Integer类型，必须得加入强制转换(Integer)
        System.out.println((Integer) pairPrinciple.first);
        System.out.println((Integer)pairPrinciple.second);
    }
    /**
     * 解释一下，实际原理其实就是上边例子写的这样
     * Java有编辑器和虚拟机，能够Java源代码转换成.class文件，虚拟机在加载.class文件，对于泛型，他其实就是转换成普通非泛型的代码，
     * 如我上边例子和Pair中的例子那样。
     * 将类的T或者S擦除，替换为Object,插入必要的强制类转换，Java虚拟机执行的时候他确实不知道有泛型这回事。只认识普通代码和类
     * 这个地方，很强调一下，Java泛型是通过擦除实现的，类定义中的类型参数如T会被替换为Object，在程序运行过程中，不知道泛型的实际类型参数，
     * 比如Pair<Integer>，运行中只知道Pair，而不知道Integer。认识到这一点是非常重要的，它有助于我们理解Java泛型的很多限制
     */
}
